package com.sisgesbyte.dao.proyeccion;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.ProyeccionFfvvDetalleResponse;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.proyeccion.ProyeccionFFVVDetalleEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantProyeccionFFVVDetalleDaoImpl extends AbstractFacade<ProyeccionFFVVDetalleEntity>  implements MantProyeccionFFVVDetalleDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;

	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	public MantProyeccionFFVVDetalleDaoImpl() {
		super(ProyeccionFFVVDetalleEntity.class);
	}
	@Override
	public List<ProyeccionFFVVDetalleEntity> listaProyeccionFFVVdetalle(FiltrosSQLBean cadenaFiltros) {
		
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT pfd.id, pf.empleado_estructura_id,pf.periodo_id,pfd.proyeccion_ffvv_id, pfd.producto_id,p.categoria_producto_id,  ");
		jpql.append("cp.nombre categoria_producto,p.marca_id, m.marca,p.cod_prod,p.producto, p.precio_promedio,pfd.codigo_banda, pfd.cantidad_proyectada  ");
		jpql.append("FROM proyeccion.proyeccion_ffvv_detalle pfd    ");
		jpql.append("inner join proyeccion.proyeccion_ffvv pf on pfd.proyeccion_ffvv_id=pf.id   ");
		jpql.append("inner join administracion.producto p on pfd.producto_id=p.id    ");
		jpql.append("inner join administracion.categoria_producto cp on p.categoria_producto_id=cp.id    ");
		jpql.append("inner join administracion.marca m on p.marca_id=m.id   ");
		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}
		Query query = em.createNativeQuery(jpql.toString(),
				ProyeccionFFVVDetalleEntity.class);
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				query.setParameter(++num, valor);
			}
		}
		List<ProyeccionFFVVDetalleEntity> ls = query.getResultList();

		return ls;
	}

	@Override
	public GenericEntity guardarProyeccionFfvvDet( ProyeccionFfvvDetalleResponse request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from proyeccion.sp_registrar_proyeccion_ffvv_detalle(:in_proyeccion_ffvv_id, :in_producto_id, :in_cantidad_proyectada, :in_codigo_banda)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		System.out.println("request.getProyeccionFfvvId() : " + request.getProyeccionFfvvId());
		query.setParameter("in_proyeccion_ffvv_id", request.getProyeccionFfvvId());
		query.setParameter("in_producto_id", request.getProductoId());
		query.setParameter("in_cantidad_proyectada", request.getCantidadProyectada());
		query.setParameter("in_codigo_banda", request.getCodigoBanda());
		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarProyeccionFfvvDet(
			ProyeccionFfvvDetalleResponse request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from proyeccion.sp_actualizar_proyeccion_ffvv_detalle(:in_id, :in_proyeccion_ffvv_id, :in_producto_id, :in_cantidad_proyectada, :in_codigo_banda)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", request.getId());
		query.setParameter("in_proyeccion_ffvv_id", request.getProyeccionFfvvId());
		query.setParameter("in_producto_id", request.getProductoId());
		query.setParameter("in_cantidad_proyectada", request.getCantidadProyectada());
		query.setParameter("in_codigo_banda", request.getCodigoBanda());
		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarProyeccionFfvvDet(int codProyeccion) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT * from proyeccion.sp_eliminar_proyeccion_ffvv_detalle(:in_id)");
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", codProyeccion);
		return (GenericEntity) query.getSingleResult();
	}

}
